package com.gcspring.h2db.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: guc
 * @Description: 编码获取规则
 * @Date: 2021/6/18 15:24
 * @Version: 1.0
 */
public class CodeRuleUtils {
    //131为人脸抓拍机，121为车辆抓拍机，220为门禁点，125为门禁设备，126为访客设备，119为在线视频图像信息采集设备
    public static final String TYPE_RXZP = "131";
    public static final String TYPE_CLZP = "121";
    public static final String TYPE_MJSB = "125";
    //以下不常用
    public static final String TYPE_MJD = "220";
    public static final String TYPE_FKSB = "126";
    public static final String TYPE_ZXSPTXXXCJSB = "119";

    private static final String PATTERN_PICTURE_OBJECT_ID = "4101030000120020394002%s%05d";
    private static final String PATTERN_PICTURE_OBJECT_ID_DEVICE = "%s%02d%s%05d";
    private static final String PATTERN_FACE_ID = "%s06%05d";
    private static final String PATTERN_DOOR_EVENT_ID = "%s09%05d";
    private static final String PATTERN_MOTOR_VEHICLE_ID = "%s02%05d";
    private static final String PATTERN_DEVICE_ID = "%s%06d";
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

    /**
     * 获取图像基本对象统一标识
     *
     * @param createTime   创建时间：yyyyMMddHHmmss
     * @param seriesNumber 序列号 ：0~99999
     * @return 41位 示例：41010300001200203940022021061815430000001
     */
    public static String getPictureObjectId(String createTime, int seriesNumber) {
        if (seriesNumber > 99999)
            seriesNumber = 99999;
        return String.format(PATTERN_PICTURE_OBJECT_ID, createTime, seriesNumber);
    }


    /**
     * @param deviceNo     设备编码
     * @param type         1.视频  2、图片  3、文件  99 其他
     * @param createTime   创建时间：yyyyMMddHHmmss
     * @param seriesNumber 序列号 ：0~99999
     * @return 41位 示例：41010300001200203940022021061815430000001
     */
    public static String getPictureObjectIdDevice(String deviceNo, int type, String createTime, int seriesNumber) {
        if (seriesNumber > 99999)
            seriesNumber = 99999;
        return String.format(PATTERN_PICTURE_OBJECT_ID_DEVICE, deviceNo, type, createTime, seriesNumber);
    }

    /**
     * @param deviceNo     设备编码
     * @param createTime   创建时间：yyyyMMddHHmmss
     * @param seriesNumber 序列号 ：0~99999
     * @return 41位 示例：41010300001200203940022021061815430000001
     */
    public static String getPictureObjectIdDoorDevice(String deviceNo, String createTime, int seriesNumber) {
        return getPictureObjectIdDevice(deviceNo, 99, createTime, seriesNumber);
    }

    /**
     * 获取图像基本对象统一标识
     *
     * @param seriesNumber 序列号 ：0~99999
     * @return 41位 示例：41010300001200203940022021061815430000001
     */
    public static String getPictureObjectId(int seriesNumber) {
        return getPictureObjectId(sdf.format(new Date()), seriesNumber);
    }


    /**
     * 人脸ID 48位
     *
     * @param pictureObjectId 人脸图片ID
     * @param seriesNumber    序列号
     * @return 48位
     */
    public static String getFaceId(String pictureObjectId, int seriesNumber) {
        if (seriesNumber > 99999)
            seriesNumber = 99999;
        return String.format(PATTERN_FACE_ID, pictureObjectId, seriesNumber);
    }

    /**
     * DoorEventID 48位
     *
     * @param pictureObjectId
     * @param seriesNumber    序列号
     * @return 48位
     */
    public static String getDoorEventId(String pictureObjectId, int seriesNumber) {
        if (seriesNumber > 99999)
            seriesNumber = 99999;
        return String.format(PATTERN_DOOR_EVENT_ID, pictureObjectId, seriesNumber);
    }

    /**
     * 车辆抓拍 MotorVehicleID  48位
     *
     * @param pictureObjectId 图片ID
     * @param seriesNumber    序列号
     * @return 48位
     */
    public static String getMotorVehicleId(String pictureObjectId, int seriesNumber) {
        if (seriesNumber > 99999)
            seriesNumber = 99999;
        return String.format(PATTERN_MOTOR_VEHICLE_ID, pictureObjectId, seriesNumber);
    }


    /**
     * 获取设备ID
     *
     * @param centerNumber 中心编码 8位  41010268 郑州市公安局中原分局桐柏路派出所
     * @param tradeNumber  行业编码 2位  01  社会治安社区接入，包括社区、楼宇、网吧等
     * @param typeNumber   类型编码 3位  131为人脸抓拍机，121为车辆抓拍机，220为门禁点，125为门禁设备，126为访客设备，119为在线视频图像信息采集设备
     * @param netFlag      网络标识 1位  其中0、1、2、3、4为监控报警专网，5为公安信息网，6为政务网，7为Internet网，8为社会资源接入网，9为预留
     * @param seriesNumber 序列号  6位  0-999999
     * @return 20位
     */
    public static String getDeviceId(String centerNumber, String tradeNumber, String typeNumber, String netFlag, int seriesNumber) {
        return String.format(PATTERN_DEVICE_ID, centerNumber + tradeNumber + typeNumber + netFlag, seriesNumber);
    }

    public static String getDeviceId(String typeNumber, int seriesNumber) {
        return getDeviceId("41010268", "01", typeNumber, "5", seriesNumber);
    }

    public static String getDeviceId(String centerNumber, String typeNumber, int seriesNumber) {
        return getDeviceId(centerNumber, "01", typeNumber, "7", seriesNumber);
    }


    public static void main(String[] args) {
        String picId = getPictureObjectIdDoorDevice("41010268011255000002", "20210618154300", 1);
        String doorId = getDoorEventId(picId, 1);
        System.out.println(picId);
        System.out.println(doorId);
    }
}
